#include <iostream>
#include <cstdlib>

class Test
{
public:
    Test()
    {
        // p = new int;
        std::cout << "构造函数\n";
    }
    Test(const Test &t)
    {
        std::cout << "拷贝构造函数\n";
        // p = new int(*t.p);
        // p = new int;
        // *p = *t.p;
    }
    ~Test()
    {
        // delete p;
        std::cout << "析构函数\n";
    }

private:
    int *p;
};

// 返回值会增加拷贝
// Test &func()
// {
//     static Test t;
//     return t;
// }

/*无拷贝*/
// Test func()
// {
//     Test t;
//     return t;
// }

/*有拷贝*/
Test func(Test &t)
{
    return t;
}

int main()
{
#if 0
    Test *t = new Test[10];
    std::cout << "----------------\n";
    Test *t1 = (Test *)malloc(sizeof(Test) * 1);
    delete[] t;
    free(t1);
#endif
#if 0
    Test t;
    // Test t2 = t;
    Test t2(t);
#endif
    // Test();//匿名对象：生命周期只有一行代码
    // Test t = Test(); // 一个对象
    // Test t;
    // t = Test();两个对象
    Test t;
    Test t2 = func(t); // 相当于返回一个匿名对象
    std::cout << "---------------\n";
    return 0;
}